using System;
using System.Collections.Generic;
using System.Text;

using RRHH.Competencias.DataAccessLayer.Generic;
using RRHH.Competencias.DataAccessLayer;
using RRHH.Competencias.Entities;

namespace RRHH.Competencias.Controladores
{
    public class GestorTarea
    {
        private IDALTarea persistencia;
        
        public GestorTarea()
        {
            persistencia = DALProvider.GetDALTarea();        
        }

        /// <summary>
        /// Crea una tarea
        /// </summary>
        /// <param name="tarea">Tarea a crear. Se devuelve el ID de la tarea creada</param>
        public void Registrar(Tarea tarea)
        {
            if (tarea == null) throw new Exception("Debe indicar la tarea");

            //Reglas de negocio
            if (string.IsNullOrEmpty(tarea.Nombre)) throw new Exception("Debe indicar el nombre de la tarea");
            if (tarea.ContarCapacidades() == 0) throw new Exception("Debe indicar al menos una capacidad asocida a la tarea");

            persistencia.Guardar(tarea);
        }

        /// <summary>
        /// Modifica la informacion disponible de una Tarea
        /// </summary>
        /// <param name="tarea">Tarea a eliminar</param>
        public void Modificar(Tarea tarea)
        {
            if (tarea == null) throw new Exception("Debe indicar la tarea");
            if (tarea.Id <= 0) throw new Exception("Debe indicar el ID de la tarea");

            //Reglas de negocio
            if (string.IsNullOrEmpty(tarea.Nombre)) throw new Exception("Debe indicar el nombre de la tarea");
            if (tarea.ContarCapacidades() == 0) throw new Exception("Debe indicar al menos una capacidad asocida a la tarea");

            persistencia.Actualizar(tarea);
        }

        /// <summary>
        /// Activa el puesto de la base 
        /// </summary>
        /// <param name="item"></param>
        public void Activar(Tarea tarea)
        {
            if (tarea == null) throw new Exception("Debe indicar la tarea");
            if (tarea.Id <= 0) throw new Exception("Debe indicar el ID de la tarea");

            //TODO: Reglas de negocio

            persistencia.Activar(tarea);
        }

        /// <summary>
        /// Borra logicamente la tarea de la base 
        /// </summary>
        /// <param name="item"></param>
        public void Desactivar(Tarea tarea)
        {
            if (tarea == null) throw new Exception("Debe indicar la tarea");
            if (tarea.Id <= 0) throw new Exception("Debe indicar el ID de la tarea");

            //TODO: Reglas de negocio

            persistencia.Desactivar(tarea);
        }


        /// <summary>
        /// Elimina una tarea
        /// </summary>
        /// <param name="tarea">Tarea a eliminar. Indicar el ID</param>
        public void Eliminar(Tarea tarea)
        {
            if (tarea == null) throw new Exception("Debe indicar la tarea");
            if (tarea.Id <= 0) throw new Exception("Debe indicar el ID de la tarea");

            persistencia.Borrar(tarea);
        }

        /// <summary>
        /// Obtiene los datos de una tarea
        /// </summary>
        /// <param name="tarea">Tarea a completar. Indicar el ID</param>
        public void Completar(Tarea tarea)
        {
            if (tarea == null) throw new Exception("Debe indicar la tarea");
            if (tarea.Id <= 0) throw new Exception("Debe indicar el ID de la tarea");

            persistencia.Completar(tarea);
            GestorCapacidad gCapacidad = new GestorCapacidad();
            foreach (Capacidad capacidad in tarea.Capacidades)
            {
                gCapacidad.Completar(capacidad);
            }
        }

        /// <summary>
        /// Recupera un listado de todas las tareas registradas
        /// </summary>
        /// <returns>Listado con todas las tareas</returns>
        public List<Tarea> ObtenerListadoCompleto()
        {
            return persistencia.BuscarTodos();
        }

        public List<Tarea> BuscarTodos()
        {
            try
            {
                return persistencia.BuscarTodos();
            }
            catch (Exception ex)
            {
                throw new DALException(ex.Message);
            }
        }

        public List<Tarea> Buscar(long? id, string nombre, string descripcion, bool activo)
        {
            try
            {
                return persistencia.Buscar(id, nombre, descripcion, activo);

            }
            catch (Exception ex)
            {
                throw new DALException(ex.Message);
            }
        }
    }
}
